/*
Description

现在大家正在为完成网络教室的题目而奋斗。你想获得更高的分数，但发现自己的效率有点儿低，于是请你写个程序计算一下：

假设一共有 n 个题目，每个题目 i 你都需要一个单位时间来完成。同时每个题目 i 都有一个完成期限 di 和相应的分数 pi 。这里的完成期限是指应在开始时间之后 di 个时间单位内（含di）完成，不能迟交。

所有题目同时开始计时，当且仅当题目 i 在它的期限截止以前被完成时，你才能获得 pi 的分数。完成期限的设定使得你不一定能将所有的题目全都按时完成。因此只有合理安排做题的顺序，才能在有限的时间内获得最高的分数。

问：在这种条件下，你能够得到的最高的分数是多少？

Input

第一行输入题目的总个数 n <= 10000;
第二行输入各个题目的分数 0 < pi <= 100;
第三行输入每一个题目的完成期限 0 < di <= 10000;

Output

输出最高的分数。
*/

#ifdef _MSC_VER
#define _CRT_SECURE_NO_WARNINGS
#endif
#if defined(_WIN32) && !defined(__cplusplus)
#define inline __inline
#endif



#include <stdio.h>
#include <stdlib.h>

#define max(a,b)    (((a) > (b)) ? (a) : (b))
#define min(a,b)    (((a) < (b)) ? (a) : (b))

#define BOOL	int 
#define TRUE	1
#define FALSE	0

typedef struct Exercise
{
	int point;		//分数
	int deadline;		//截止日期
	BOOL done;
}Exercise;

static inline int cmp(const void *a, const void *b)
{
	if (((Exercise *)a)->deadline == ((Exercise *)b)->deadline)
	{
		return ((Exercise *)a)->point > ((Exercise *)b)->point;
	}
	return ((Exercise *)a)->deadline < ((Exercise *)b)->deadline;
}

Exercise exercise[10000];
int main(int argc, char **argv, char **envp)
{
	int i, j;
	int T;
	int allPoint = 0;
	int allTime = 0;
	int maxPoint = 0;
	int maxIndex = 0;

	scanf("%d", &T);
	for (i = 0; i < T; i++)
	{
		scanf("%d", &exercise[i].point);
		exercise[i].done = FALSE;
	}
	for (i = 0; i < T; i++)
	{
		scanf("%d", &exercise[i].deadline);
		allTime = max(allTime, exercise[i].deadline);
	}
	qsort(exercise, T, sizeof(exercise[0]), cmp);

	for (i = allTime; i > 0; i--)
	{//从最后一天开始安排，挑选当天能挑的分值最大的题目做
		maxPoint = 0;
		for (j = 0; exercise[j].deadline >= i; j++)
		{
			if (exercise[j].done == TRUE)
			{
				continue;
			}
			//寻找当天能做的分值最大的题目
			if (exercise[j].point > maxPoint)
			{
				maxPoint = exercise[j].point;//分值
				maxIndex = j;//序号
			}
		}
		allPoint += maxPoint;
		exercise[maxIndex].done = TRUE;
	}

	printf("%d\n", allPoint);
	return 0;
}